clc;
clear all;
    % 示例邻接矩阵
    edges = reg();
    adjmatrix = edgesToAdjMatrix(edges);
% 输入模式选择
disp('问题三-Dijkstra算法！')
mode = input('请输入模式 (1: 起点到所有节点的最短距离, 2: 指定起终点的最短路径和距离): ');

if mode == 1
    start_node = input('请输入起点节点: ');
    
    % 计算从起点到所有节点的最短距离
    n = size(adjmatrix, 1);
    shortest_distances = zeros(1, n);
    for i = 1:n
        if i ~= start_node
            [shortest_distance] = dijkstra(adjmatrix, start_node, i);
            shortest_distances(i) = shortest_distance;
        else
            shortest_distances(i) = 0; % 起点到自身的距离为0
        end
    end
    
    disp(['从起点节点 ', num2str(start_node), ' 到所有节点的最短距离:']);
    for i = 1:n
        if isinf(shortest_distances(i))
            fprintf('从节点 %d 到节点 %d 的最短距离: 无穷大\n', start_node, i);
        else
            fprintf('从节点 %d 到节点 %d 的最短距离: %.2f\n', start_node, i, shortest_distances(i));
        end
    end
elseif mode == 2
    start_node = input('请输入起点节点: ');
    end_node = input('请输入终点节点: ');
    
    % 计算从起点到终点的最短路径和最短距离
    [shortest_distance, shortest_path] = dijkstra(adjmatrix, start_node, end_node);
    disp(['从节点 ', num2str(start_node), ' 到节点 ', num2str(end_node), ' 的最短距离:']);
    disp(shortest_distance);
    disp(['从节点 ', num2str(start_node), ' 到节点 ', num2str(end_node), ' 的最短路径:']);
    disp(shortest_path);
    G = digraph(edges(:,1), edges(:,2), edges(:,3));
    
    % 计算最短路径
    [shortest_path, shortest_length] = shortestpath(G, start_node, end_node);
    
    % 显示结果
    fprintf('起点: %d\n', start_node);
    fprintf('终点: %d\n', end_node);
    fprintf('最短路径长度: %.2f\n', shortest_length);
    fprintf('最短路径: ');
    disp(shortest_path);
    
    % 可视化有向图
    figure;
    h = plot(G, 'EdgeLabel', G.Edges.Weight, 'ArrowSize', 10);
    
    % 高亮显示最短路径
    for i = 1:length(shortest_path)-1
        highlight(h, shortest_path(i), shortest_path(i+1), 'EdgeColor', 'r', 'LineWidth', 2);
    end
    
    % 标记起点和终点
    highlight(h, start_node, 'NodeColor', 'g', 'MarkerSize', 8);
    highlight(h, end_node, 'NodeColor', 'b', 'MarkerSize', 8);
    
    title(sprintf('Sioux Falls网络从节点%d到节点%d的最短路径', start_node, end_node));
else
    error('无效的模式选择，请输入 1 或 2。');
end

